package com.ymttest.business.data;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ymatou.tool.Logger;
import com.ymttest.utils.TestDataManager;

public class DataMerge {
	/**
	 * 使用场景:从文件中获取一组数据,第一行定义列名,后面是数据
	 * 把这组list转换成key是指定参数的map map的key是第一列value是后面的数据
	 * file->list:
	 * a,b,c //第0行为key
	 * 1,2,3 //value
	 * key=b,split=,
	 * ->{2,{a=1,b=2,c=3}}
	 * @param list 参数文件读取出来
	 * @param key 主key
	 * @param slip 分隔符
	 * @return map key是 key的value value是这一行对应转换成的key
	 */
	public static Map<String,Map> GetListToMap(List<String> list,String key,String split){
		Map<String,Map> m=new HashMap<String,Map>();
		String[] keys=list.get(0).split(split);
		int keyindex=0;
		for(int i=0;i<keys.length;i++){
			if(keys[i].equals(key)){
				keyindex=i;
			}
		}
		list.remove(0);
		for (String line : list) {
			String[] data = line.split(split);
			if(data.length==keys.length){
				Map mdata=new HashMap<>();
				for(int i=0;i<keys.length;i++){
					mdata.put(keys[i],data[i]);
				}
				m.put(data[keyindex], mdata);
			}else{
				System.out.println("data not eq keys:"+line);
			}
		}
		return m;
	}
	/**
	 * 拼装2个文件
	 * @param f1 主文件-尽量以此文件数据为准
	 * @param f1key 结果集唯一主键
	 * @param f2 追加文件-追加主文件缺少的列
	 * @param f2key 结果集关联键-f1的存在列 f2的主键-
	 * @param outputfile 输出文件
	 * 举例
	 * 遍历f1每一行,获取到和f2的f2key一致的数据合并成一行
	 * f1key是生成最终数据的唯一主键
	 */
	public static void LeftMerge(String f1,String f1key,String f2,String f2key,String outputfile) {
		ArrayList<String> list1 = TestDataManager.getLines(f1);
		System.out.println(f1+":读取完成:"+list1.size());
		Map<String, Map> allm1 = DataMerge.GetListToMap(list1, f1key, ",");
		System.out.println(f1+":分配完成:"+allm1.size());
		ArrayList<String> list2 = TestDataManager.getLines(f2);
		System.out.println(f2+":读取完成:"+list2.size());
		Map<String, Map> allm2 = DataMerge.GetListToMap(list2, f2key, ",");
		System.out.println(f2+":分配完成:"+allm2.size());
		Map<String, Map> result=new HashMap<>();
		allm1.entrySet().forEach(e1->{
			//从第一个文件中获取f2key的值然后查出第二个文件中f2key值的整行数据 查不到就不处理
			Map appendinfo=new HashMap<>();
			Map me1=e1.getValue();
			if(allm2.containsKey(me1.get(f2key))) {
				appendinfo.putAll(allm2.get(me1.get(f2key)));
			}else {
				System.out.println(f2key+"数据未匹配:"+me1.get(f2key));
			}
			if(appendinfo!=null&&appendinfo.size()>0){
				//第一个文件中的内容追加到第二个文件列如果重复key覆盖
				appendinfo.putAll(me1);
				result.put(e1.getKey(), appendinfo);
			}
		});
		System.out.println("数据合并完成:"+result.size());
		String filekeys="";
		//获取第一行keys
		//获取result随机一个map的所有key然后拼接
		Object[] filekey =result.entrySet().stream().findAny().get().getValue().keySet().stream().toArray();
		for(int i=0;i<filekey.length;i++){
			filekeys+=filekey[i].toString()+",";
		}
		filekeys= filekeys.substring(0, filekeys.length()-1);
		//输出第一行
		TestDataManager.appendFileToLine(outputfile, filekeys);
		//通过第一行知道所有key,然后逐个获取
		String[] listkeys = filekeys.split(",");
		result.entrySet().forEach(mresult->{
			//每一行数据安装第一行的顺序重新取得然后输出文件
			String filebody="";
			for(int i=0;i<listkeys.length;i++){
				filebody+=mresult.getValue().get(listkeys[i])+",";
			}
			filebody= filebody.substring(0, filebody.length()-1);
			TestDataManager.appendFileToLine(outputfile, filebody);
		});
		System.out.println("数据输出完成");
	}
	public static void main(String args[]){
		DataMerge.LeftMerge("stglive.txt", "pid", "sellertoken.txt", "sellerid", "temp2.txt");
//		DataMerge.LeftMerge("userandcouponcode_heiwu1.txt", "CouponCode", "accesstoken.txt", "UserId", "temp1.txt");
//		DataMerge.LeftMerge( "temp1.txt", "UserId", "sellercoupon.txt", "UserId","temp2.txt");
//		ArrayList<String> lcoupon = TestDataManager.getLines("ymtcoupon20181114.txt");
//		Map<String, Map> mcoupon = DataMerge.GetListToMap(lcoupon, "CouponCode", ",");
//		ArrayList<String> luinfo = TestDataManager.getLines("address_token_uid.txt");
//		Map<String, Map> muinfo = DataMerge.GetListToMap(luinfo, "userid", ",");
//		Map<String, Map> result=new HashMap<>();
//		//合并2个map mcoupon的value中的UserId获取muinfo和value 后 putall 合并
//		mcoupon.entrySet().forEach(scoupon->{
//			Map info=muinfo.get(scoupon.getValue().get("UserId"));
//			if(info!=null){
//				Map mscoupon = scoupon.getValue();
//				mscoupon.putAll(info);
//				result.put(scoupon.getKey(), mscoupon);
//			}
//		});
////		result.entrySet().forEach(m->{
////			System.out.println(m);
////		});
//		
//		String filekeys="";
//		//获取第一行keys
//		//获取result随机一个map的所有key然后拼接
//		Object[] filekey =result.entrySet().stream().findAny().get().getValue().keySet().stream().toArray();
//		for(int i=0;i<filekey.length;i++){
//			filekeys+=filekey[i].toString()+",";
//		}
//		filekeys= filekeys.substring(0, filekeys.length()-1);
//		//输出第一行
//		TestDataManager.appendFileToLine("result.txt", filekeys);
//		//通过第一行知道所有key,然后逐个获取
//		String[] listkeys = filekeys.split(",");
//		result.entrySet().forEach(mresult->{
//			//每一行数据安装第一行的顺序重新取得然后输出文件
//			String filebody="";
//			for(int i=0;i<listkeys.length;i++){
//				filebody+=mresult.getValue().get(listkeys[i])+",";
//			}
//			filebody= filebody.substring(0, filebody.length()-1);
//			TestDataManager.appendFileToLine("result.txt", filebody);
//		});
//		com.ymt.core.tool.Logger.info("end");
	}
	
}
